package com.kk.utils;

import com.kk.enums.BaseEnum;

import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 枚举工具类
 *
 * @author kl
 */
public class EnumUtil {

    /**
     * 根据 value 获取枚举对象
     *
     * @param enumClass 枚举类
     * @param value 枚举值
     * @return 枚举对象，找不到返回 null
     */
    public static <E extends Enum<E> & BaseEnum<T>, T extends Serializable> E getByValue(Class<E> enumClass, T value) {
        if (value == null) {
            return null;
        }

        for (E enumConstant : enumClass.getEnumConstants()) {
            if (value.equals(enumConstant.getValue())) {
                return enumConstant;
            }
        }
        return null;
    }

    /**
     * 根据 value 获取 label
     *
     * @param enumClass 枚举类
     * @param value 枚举值
     * @return 枚举描述，找不到返回 null
     */
    public static <E extends Enum<E> & BaseEnum<T>, T extends Serializable> String getLabelByValue(Class<E> enumClass, T value) {
        E enumConstant = getByValue(enumClass, value);
        return enumConstant != null ? enumConstant.getLabel() : null;
    }

    /**
     * 获取枚举的所有选项（用于前端下拉框）
     *
     * @param enumClass 枚举类
     * @return 选项列表
     */
    public static <E extends Enum<E> & BaseEnum<?>> List<EnumOption> getOptions(Class<E> enumClass) {
        return Arrays.stream(enumClass.getEnumConstants())
                .map(e -> new EnumOption(e.getValue(), e.getLabel()))
                .collect(Collectors.toList());
    }

    /**
     * 枚举选项（用于返回给前端）
     */
    public static class EnumOption {
        private Object value;
        private String label;

        public EnumOption(Object value, String label) {
            this.value = value;
            this.label = label;
        }

        public Object getValue() {
            return value;
        }

        public String getLabel() {
            return label;
        }
    }
}